const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CompressionPlugin = require('compression-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
module.exports = {
  // mode: 'production',
  mode: process.env.NODE_ENV === 'production' ? 'production' : 'development',
  // 入口文件
  entry: './src/index.tsx',
  // 输出配置
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'bundle.js',
  },
  // 解析模块请求的选项
  resolve: {
    // 自动解析确定的扩展
    extensions: ['.tsx', '.ts', '.js'],
    alias: {
      '@src': path.resolve(__dirname, 'src/'),
    },
  },
  module: {
    rules: [
      // 使用 'ts-loader' 处理 '.ts' 和 '.tsx' 文件
      {
        test: /\.tsx?$/,
        use: 'ts-loader',
        exclude: /node_modules/,
      },
      // 使用 'css-loader' 和 'style-loader' 处理 '.css' 文件
      {
        test: /\.css$/,
        use: ['style-loader', 'css-loader'],
      },
      // 加载图片资源
      {
        test: /\.(png|svg|jpg|jpeg|gif)$/i,
        type: 'asset/resource',
      },
      // 加载字体资源
      {
        test: /\.(woff|woff2|eot|ttf|otf)$/i,
        type: 'asset/resource',
      },
    ],
  },
  // 插件配置
  plugins: [
    new HtmlWebpackPlugin({
      template: './public/index.html',
      favicon: './public/favicon.ico',
    }),
    new CleanWebpackPlugin(),
    ...(process.env.NODE_ENV === 'production'
      ? [
          new CompressionPlugin({
            algorithm: 'gzip',
            compressionOptions: { level: 9 },
            test: /\.(bak|json|ico|html|js|css|woff|woff2|ttf|eot|png|jpg|jpeg|map)(\?.*)?$/i,
            deleteOriginalAssets: true,
            threshold: 1024,
            minRatio: 1,
          }),
        ]
      : []),
  ],
  // 开发工具，启用源码映射
  devtool: 'source-map',
  // 开发服务器配置
  devServer: {
    static: './dist',
    hot: true,
    port: 3000,
    proxy: [
      {
        context: ['/cgi-bin'], // 这里定义需要代理的路径前缀
        target: 'https://192.168.1.176/', // 目标服务器地址
        changeOrigin: true, // 修改请求的 Origin 为目标服务器的地址
        pathRewrite: { '^/cgi-bin': '/cgi-bin' }, // 如果不需要重写路径，可以省略此项
        secure: false, // 如果目标服务器使用的是自签名证书，则需要设置此项
      },
    ],
  },
  // 性能提示配置
  performance: process.env.NODE_ENV === 'production' ? {
    hints: 'warning',
    maxEntrypointSize: 512000,
    maxAssetSize: 512000,
  } : false,
};
